package com.linsen.core.common.convert;

import com.fasterxml.jackson.annotation.JsonValue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.convert.converter.Converter;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/** 字符串转枚举 */
@Slf4j
public class StringToEnumConverter<T extends Enum> implements Converter<String, T> {

    private Map<String, T> enumMap = new HashMap<>();

    public StringToEnumConverter(Class<T> enumType) {
        //Enum有JsonValue注解时使用该值解析，否则使用默认的name解析

        Field[] fields = enumType.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(JsonValue.class)){
                try {
                    field.setAccessible(true);
                    T[] enums = enumType.getEnumConstants();
                    for (T e : enums) {
                        enumMap.put(String.valueOf(field.get(e)), e);
                    }
                } catch (IllegalAccessException e) {
                    log.error("enum map construct failed:", e);
                }
                return;
            }
        }

        T[] enums = enumType.getEnumConstants();
        for (T e : enums) {
            enumMap.put(e.name(), e);
        }
    }

    @Override
    public T convert(String source) {
        return enumMap.get(source);
    }
}
